package com.serviportales.serviquality.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import com.serviportales.serviportales.dao.GenericHibernateDAO;
import com.serviportales.serviportales.exceptions.DAOException;
import com.serviportales.serviportales.utils.BeansUtils;
import com.serviportales.serviquality.model.Plantilla;
import com.serviportales.serviquality.model.PlantillaNodo;

@Repository
public class PlantillaNodoDAO extends GenericHibernateDAO<PlantillaNodo> {

	private static final long serialVersionUID = 1L;

	@Override
	public DetachedCriteria getBasicDetachedCriteria(PlantillaNodo plantillaNodo) throws DAOException {
		try {
			DetachedCriteria criteria = DetachedCriteria.forClass(PlantillaNodo.class);

			// Plantilla
			if (BeansUtils.getDatoAtributo(plantillaNodo, "plantillaNodoPK.plantilla.codigo") != null) {
				criteria.add(Restrictions.eq("plantillaNodoPK.plantilla.codigo", plantillaNodo.getPlantillaNodoPK().getPlantilla().getCodigo()));
			}
			// Parent
			if (BeansUtils.getDatoAtributo(plantillaNodo, "parent.plantillaNodoPK.plantilla.codigo") != null) {
				criteria.add(Restrictions.eq("parent.plantillaNodoPK.plantilla.codigo", plantillaNodo.getParent().getPlantillaNodoPK().getPlantilla().getCodigo()));
			}
			if (BeansUtils.getDatoAtributo(plantillaNodo, "parent.plantillaNodoPK.nodo.nodoPK.codigo") != null) {
				criteria.add(Restrictions.eq("parent.plantillaNodoPK.nodo.nodoPK.codigo", plantillaNodo.getParent().getPlantillaNodoPK().getNodo().getNodoPK().getCodigo()));
			}
			if (BeansUtils.getDatoAtributo(plantillaNodo, "parent.plantillaNodoPK.nodo.nodoPK.tipoNodo.codigo") != null) {
				criteria.add(Restrictions.eq("parent.plantillaNodoPK.nodo.nodoPK.tipoNodo.codigo", plantillaNodo.getParent().getPlantillaNodoPK().getNodo().getNodoPK().getTipoNodo().getCodigo()));
			}

			return criteria;
		} catch (Exception e) {
			throw new DAOException(e.getMessage(), e);
		}

	}

	public PlantillaNodo selectByID(Serializable codigo) {
		return getHibernateTemplate().get(PlantillaNodo.class, codigo);
	}

	@SuppressWarnings("unchecked")
	public List<PlantillaNodo> selectChildren(PlantillaNodo plantillaNodo) {
		String strQuery = "from PlantillaNodo as plantillaNodo " + //
				"left join fetch plantillaNodo.parent " + //
				"left join fetch plantillaNodo.parent.plantillaNodoPK.plantilla " + //
				"left join fetch plantillaNodo.parent.plantillaNodoPK.nodo " + //
				"left join fetch plantillaNodo.parent.plantillaNodoPK.nodo.nodoPK.tipoNodo " + //
				"join fetch plantillaNodo.plantillaNodoPK.plantilla " + //
				"join fetch plantillaNodo.plantillaNodoPK.nodo " + //
				"join fetch plantillaNodo.plantillaNodoPK.nodo.nodoPK.tipoNodo " + //
				"where plantillaNodo.plantillaNodoPK.plantilla.codigo = :cdPlantilla ";
		if (plantillaNodo.getPlantillaNodoPK().getNodo() == null) {
			strQuery += "and (plantillaNodo.parent.plantillaNodoPK.nodo.nodoPK.codigo is null) ";
		} else {
			strQuery += "and (plantillaNodo.parent.plantillaNodoPK.nodo.nodoPK.codigo = :cdNodo) " + //
					"and (plantillaNodo.parent.plantillaNodoPK.nodo.nodoPK.tipoNodo.codigo = :cdTipoNodo) ";
		}

		Query query = getSession().createQuery(strQuery);
		query.setString("cdPlantilla", plantillaNodo.getPlantillaNodoPK().getPlantilla().getCodigo());
		if (plantillaNodo.getPlantillaNodoPK().getNodo() != null) {
			query.setString("cdNodo", plantillaNodo.getPlantillaNodoPK().getNodo().getNodoPK().getCodigo());
			query.setString("cdTipoNodo", plantillaNodo.getPlantillaNodoPK().getNodo().getNodoPK().getTipoNodo().getCodigo());
		}

		return query.list();
	}

	@SuppressWarnings("unchecked")
	public List<PlantillaNodo> selectCreateTree(Plantilla plantilla) {
		String strQuery = "from PlantillaNodo as plantillaNodo " + //
				"left join fetch plantillaNodo.parent " + //
				"left join fetch plantillaNodo.parent.plantillaNodoPK.plantilla " + //
				"left join fetch plantillaNodo.parent.plantillaNodoPK.nodo " + //
				"left join fetch plantillaNodo.parent.plantillaNodoPK.nodo.nodoPK.tipoNodo " + //
				"join fetch plantillaNodo.plantillaNodoPK.plantilla " + //
				"join fetch plantillaNodo.plantillaNodoPK.nodo " + //
				"join fetch plantillaNodo.plantillaNodoPK.nodo.nodoPK.tipoNodo " + //
				"where plantillaNodo.plantillaNodoPK.plantilla.codigo = :codigo " + //
				"order by plantillaNodo.plantillaNodoPK.nodo.nodoPK.tipoNodo.nivel";
		Query query = getSession().createQuery(strQuery);
		query.setProperties(plantilla);
		return query.list();
	}
}
